const crypto = require("crypto");

function sha256(message, secret = "", encoding) {
    const hmac = crypto.createHmac("sha256", secret);
    return hmac.update(message).digest(encoding);
}
function getHash(message, encoding = "hex") {
    const hash = crypto.createHash("sha256");
    return hash.update(message).digest(encoding);
}
function getDate(timestamp) {
    const date = new Date(timestamp * 1000);
    const year = date.getUTCFullYear();
    const month = ("0" + (date.getUTCMonth() + 1)).slice(-2);
    const day = ("0" + date.getUTCDate()).slice(-2);
    return `${year}-${month}-${day}`;
}

/**
 *
 * @param endpoint 请求链接
 * @param action 接口名称
 * @param version 版本
 * @param region 地域 默认:"ap-shanghai"
 */
function encrypt({
    endpoint,
    action,
    version = "2020-03-04",
    region = "ap-shanghai",
}) {
    // 密钥参数
    const SECRET_ID = "AKID0znMK2EuTnIYaMq3HFThfQu7Z1GGusnR";
    const SECRET_KEY = "UjyzkF9pLcbMqB7zcy2yh9rVR8YigRv3";

    // const endpoint = "cvm.tencentcloudapi.com";
    // const service = "ft";
    const service = "cvm";
    // const region = "ap-guangzhou";
    // const action = "DescribeInstances";
    // const version = "2017-03-12";
    //const timestamp = getTime()
    const timestamp = Math.round(Date.now() / 1000);
    //时间处理, 获取世界时间日期
    const date = getDate(timestamp);

    // ************* 步骤 1：拼接规范请求串 *************
    const signedHeaders = "content-type;host";

    const payload =
        '{"Limit": 1, "Filters": [{"Values": ["\\u672a\\u547d\\u540d"], "Name": "instance-name"}]}';

    const hashedRequestPayload = getHash(payload);
    const httpRequestMethod = "POST";
    const canonicalUri = "/";
    const canonicalQueryString = "";
    const canonicalHeaders =
        "content-type:application/json; charset=utf-8\n" +
        "host:" +
        endpoint +
        "\n";

    const canonicalRequest =
        httpRequestMethod +
        "\n" +
        canonicalUri +
        "\n" +
        canonicalQueryString +
        "\n" +
        canonicalHeaders +
        "\n" +
        signedHeaders +
        "\n" +
        hashedRequestPayload;

    // ************* 步骤 2：拼接待签名字符串 *************
    const algorithm = "TC3-HMAC-SHA256";
    // const algorithm = "TC3-HMAC-SHA256";
    const hashedCanonicalRequest = getHash(canonicalRequest);
    const credentialScope = date + "/" + service + "/" + "tc3_request";
    const stringToSign =
        algorithm +
        "\n" +
        timestamp +
        "\n" +
        credentialScope +
        "\n" +
        hashedCanonicalRequest;

    // ************* 步骤 3：计算签名 *************
    const kDate = sha256(date, "TC3" + SECRET_KEY);
    const kService = sha256(service, kDate);
    const kSigning = sha256("tc3_request", kService);
    const signature = sha256(stringToSign, kSigning, "hex");

    // ************* 步骤 4：拼接 Authorization *************
    const authorization =
        algorithm +
        " " +
        "Credential=" +
        SECRET_ID +
        "/" +
        credentialScope +
        ", " +
        "SignedHeaders=" +
        signedHeaders +
        ", " +
        "Signature=" +
        signature;
    console.log(authorization, "---------------------------------------------");
    const Call_Information =
        "curl -X POST " +
        "https://" +
        endpoint +
        ' -H "Authorization: ' +
        authorization +
        '"' +
        ' -H "Content-Type: application/json; charset=utf-8"' +
        ' -H "Host: ' +
        endpoint +
        '"' +
        ' -H "X-TC-Action: ' +
        action +
        '"' +
        ' -H "X-TC-Timestamp: ' +
        timestamp.toString() +
        '"' +
        ' -H "X-TC-Version: ' +
        version +
        '"' +
        ' -H "X-TC-Region: ' +
        region +
        '"' +
        " -d '" +
        payload +
        "'";
    return authorization;
}

export default encrypt;
